﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.entidade;
using itau.im.negocio;
using EnterpriseLibraryWrapper;

namespace itau.im.gerador
{
    public static class FilaExcecao
    {
        static List<RegistroExecucaoCurva> filaExcecao = new List<RegistroExecucaoCurva>();

        public static void Adicionar(RegistroExecucaoCurva registro)
        {
            filaExcecao.Add(registro);
        }

        public static void ProcessarLimpeza()
        {
            try
            {
                if (filaExcecao.Count > 0)
                {
                    RegistroExecucaoCurva[] listaCopy = filaExcecao.ToArray<RegistroExecucaoCurva>();

                    List<RegistroExecucaoCurva> listaRemocao = new List<RegistroExecucaoCurva>();

                    for (int i = 0; i < listaCopy.Length; i++)
                    {
                        try
                        {
                            AlterarExecucao(listaCopy[i]);
                            System.Diagnostics.Debug.WriteLine(string.Format("Curva removida de excecao. Codigo {0}, Data Exec {1}, Data {2} Inicio", listaCopy[i].CodigoCurva, listaCopy[i].DataHoraExecucaoCurva.ToString("dd/MM/yyyy HH:mm:ss.ffffff"), System.DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss.ffffff")));
                            listaRemocao.Add(listaCopy[i]);
                        }
                        catch (Exception ex)
                        {
                            Exception exCustom = new Exception(string.Format("Erro na limpeza da execucao da curva. Código da curva: {0} e data de execução: {1}", listaCopy[i].CodigoCurva, listaCopy[i].DataHoraExecucaoCurva), ex);
                            EnterpriseLibraryFactory.GetExceptionHandler().HandleException(exCustom, "ErrosGerador");
                        }
                    }

                    foreach (RegistroExecucaoCurva registro in listaRemocao)
                    {
                        filaExcecao.Remove(registro);
                    }
                }
            }
            catch (Exception ex)
            {
                Exception exCustom = new Exception("Erro na limpeza da execucao no ProcessarLimpeza", ex);
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(exCustom, "ErrosGerador");
            }
        }

        public static void AlterarExecucao(RegistroExecucaoCurva registro)
        {
            ExecucaoCurvaBS execucaoCurvaBS = new ExecucaoCurvaBS();
            execucaoCurvaBS.AlterarExecucaoRemoverPontos(registro);
        }
    }
}
